package EqualsAndHashCode;

import com.jingHang.pojo.Category;
import org.junit.Test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 重写equals方法，不再比较两个对象的内存地址，
 * 而是比较对象的值（根据需求）
 * <p>
 * --为什么需要hashCode()和equals（）方法？
 * java集合中判断对象是否相等时使用
 * 判断两个对象是否相等，
 * 1.如果hashCode不相等，则对象不相等
 * 2.如果hashCode相等，则用equals（）方法判断对象是否相等
 * 根据业务需求自定义判断对象相等的条件
 * <p>
 *
 *
 * 默认情况下为了确保这个哈希值的唯一性，
 *      是通过将该对象的【内部地址】转换成一个【整数】来实现的。
 *      能通过【hash值】推算出对象的内存地址
 * HashCode 的用途是为了方便快速地查找对象，当你重写了 hashCode() 后，
 * HashCode 就不再是默认的对象内部地址推导出来的，而是你自己定义的一个值。
 */
public class EqualsAndHashCode {


    /**
     * todo 作业：用汉语解释这个案例
     */
    @Test
    public void testColection() {
        //List  ArrayList: 遍历 查询性能高  LinkedList  Vector :有序
        // Map HashMap  TreeMap LinkedHashMap ： 键值对（key--value）
        //Set HashSet : 无序，元素不可重复 TreeSet LinkedHashSet

        Dog dog1 = new Dog("wangwang", "1");
        Dog dog2 = new Dog("wangwang", "1");

        Set set = new HashSet();

        set.add(dog1);
        set.add(dog2);

        Iterator iterator = set.iterator();
        //判断集合中是否有下一个元素
        while (iterator.hasNext()) {
            //获取集合的元素
            System.out.println(iterator.next());
        }

    }


    @Test
    public void test() {

        Category category1 = new Category();
        category1.setId(1);
        category1.setName("1");
        category1.setParentId(0);

        Category category2 = new Category();
        category2.setId(1);
        category2.setName("1");
        category2.setParentId(0);
        System.out.println(category1 + "  " + category2);

        System.out.println(category1.equals(category2));


    }


    @Test
    public void test2() {
        //基本数据类型的自动装箱和自动拆箱
        int b = 1;
        Integer a1 = b;
        Integer a2 = b;


        Integer a5 = new Integer(1);
        Integer a6 = new Integer(1);

        //false todo 作业：画出a5 == a6 内存分析
        System.out.println(a5 == a6);//false
        System.out.println(a5.equals(a6));//true

        //todo 作业：
        System.out.println(a1 == a2);//true
        System.out.println(a1.equals(a2));//true

        String a3 = "123";
        String a4 = "123";
        System.out.println("a3.hashCode()" + a3.hashCode());
        System.out.println("a4.hashCode()" + a4.hashCode());
        //true 判断内存地址是否相等，
        // 因为有常量池，a3和a4引用一个常量，所以a3和a4的内存地址相等
        System.out.println(a3 == a4);
        System.out.println(a3.equals(a4));//true


    }
}
